跳到主要内容

Go 语言学习-实现抽象类

在 Java 这种面向对象的语言中,抽象类是我们经常会运用到的对抽象概念进行定义的机制。

public abstract class Game {
public void play() {
System.out.println(this.name() + " is awesome!");
}
public abstract String name();
}

public class Dota extends Game {
public String name() {
return "Dota";
}
}

public class LOL extends Game {
public String name() {
return "LOL";
}
}

golang 中实现抽象类的方式

1、将抽象方法定义在 interface 中。

type IGame interface {
Name() string
}

2、定义”父类”

type Game struct {}

func (g *Game) play(game IGame) {
fmt.Printf(fmt.Sprintf("%s is awesome!", game.Name()))
}

这里是重点,我们将 game IGame 传了进来。这样我们便可以调用 “子类” 的方法来获取名字。从而间接地实现了在公共方法中调用不同 “子类” 的实现的抽象方法。

3、定义 “子类” 接着,我们再定义 Dota 和 LOL 这 2 个 struct 即可。

type Dota struct {
Game
}
func (d *Dota) Name() string {
return "Dota"
}

type LOL struct {
Game
}
func (l *LOL) Name() string {
return "LOL"
}

现在,在初始化 Dota 和 LOL 结构体后,便可以调用 func (g *Game) play(game IGame) 方法了。

dota := &Dota{}
dota.play(dota)
lol := &LOL{}
lol.play(lol)

// 输出:
//Dota is awesome!
//LOL is awesome!